home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / dev / basic / UDP_Chat.lha / UDPChat / Old_Stuff / UDP_Receive2.asc < prev    next >
Text File  |  1999-03-29  |  3KB  |  132 lines

  1. ;
  2. ;                 UDP receive code
  3. ;
  4. ;    This receives data on its socket (which is bound to a port
  5. ;  on localhost), from a host that connects to it like TCP
  6. ;  and receives data with recv_() instead of recvfrom_().
  7. ;
  8. ;  Written by Anton Reinauer <anton@ww.co.nz>.
  9. ;
  10. ;  Thanks to Paul Burkey for TCP_Funcs and to Dr. Ercole Spiteri
  11. ;  for TCP-to-Blitz.
  12. ;
  13.  
  14. WBStartup
  15. NoCli
  16. Hostname.s="localhost"  ; you need to bind to localhost
  17. #PORT=3001              ; port to bind to
  18.  
  19. INCLUDE "TCPFuncs.bb"
  20. DEFTYPE .w
  21.  
  22. ;********************************************************
  23.  
  24. .ReadUDP2
  25. Function .s ReadUDP2{}
  26.   SHARED sock.l,TCPmem.l
  27.   ;
  28.   ; This Function reads data from a connection made from another program
  29.   ; If there is no messages then it will return an empty string =""
  30.   ;
  31.   sockread.l=0                              ;Clear Readmask
  32.   sockread.l BitSet sock.l                  ;Set Readmask on our socket
  33.   e=IoctlSocket_(sock.l,#FIONREAD,TCPmem.l) ;How much data is there?
  34.   f.l=Peek.l(TCPmem.l)                        ;Place value in f
  35.  
  36.   If f>0
  37.  
  38.     c=recv_(sock.l,TCPmem.l,f,0)   ; read data from the socket
  39.                  ; which is connected to another host as in TCP
  40.  
  41.     If c>0
  42.         a=0 : c$=""
  43.         Repeat
  44.             c$=c$+Chr$(Peek.b(TCPmem+a)) : a+1   ; build string
  45.         Until a=c
  46.     EndIf
  47.  
  48.   EndIf
  49.  
  50.   Function Return c$
  51. End Function
  52.  
  53. .ConnectUDP2
  54. Function  ConnectUDP2{host$,port.w}
  55.   SHARED sock.l,host.sockaddrin,hostlen.w
  56.  
  57.   sock.l=socket_(2,2,0)   ; create UDP socket
  58.  
  59.   *a.hostent=gethostbyname_(host$)
  60.  
  61.   ;Copy Details to our Sockaddrin structure
  62.  
  63.   bb=CopyMem_(*a.hostent\h_addr_list\ItemA,&host.sockaddrin\sin_addr,*a.hostent\h_length)
  64.  
  65.   host.sockaddrin\sin_port=port     ;Set port number
  66.   host.sockaddrin\sin_family=2      ;Set type to AT_INET
  67.   hostlen=SizeOf.sockaddrin         ;Get lenght of structure sockaddrin
  68.  
  69.   If bind_(sock,host,hostlen)=0     ; bind socket to local port number
  70.     Function Return True            ; so we can receive data on that port
  71.   EndIf
  72.  
  73. End Function
  74.  
  75. ;****************************************
  76.  
  77. WbToScreen0
  78. Window 0,300,100,320,150,$1|$2|$4|$8|$400,"Receive UDP2",1,2
  79.  
  80. WindowOutput0
  81. WindowInput 0
  82.  
  83. If ConnectUDP2 {Hostname,#PORT}          ; open socket and bind it to a port number
  84.    NPrint "Bound to ",Hostname," ",#PORT
  85. Else
  86.   Print "Can't bind to host!"
  87.   Goto Exit:
  88. EndIf
  89.  
  90. ypos=10
  91.  
  92. ;****************************************
  93.  
  94. .Main
  95.  
  96. Repeat
  97.     Delay_(1)
  98.  
  99.     a$=ReadUDP2{}
  100.  
  101.     If a$<>""
  102.        t$=a$
  103.        Gosub Print_String
  104.     EndIf
  105.  
  106.     ev.l=Event
  107. Until ev=$200    ; shut down if close gadget hit
  108.  
  109.  
  110. CloseTCP{}                          ; close connection
  111.  
  112. WLocate 10,10
  113. NPrint"Connection  closed"
  114.  
  115. Exit:
  116. ; NPrint Errno_       ; print error number if needed
  117. FreeMem TCPmem.l,$2000
  118. Delay_(50)
  119.  
  120. End
  121.  
  122. ;****************************************
  123.  
  124. .Print_String
  125.       ypos+10
  126.       If ypos=130 Then ypos=20
  127.       WLocate 10,ypos
  128.       Print "                                             "
  129.       WLocate 10,ypos
  130.       Print "RECEIVED: ",t$               ; print string received
  131. Return
  132.